package pro.cherish.knowledgeutil.io;

import cn.hutool.core.io.FileUtil;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author 创建人：cherish
 * @version 版本号：V1.0
 * <p>
 * ***************************修订记录************************************
 * 2019-11-01 cherish 创建该类功能。
 * **********************************************************************
 * </p>
 * @ClassName 类名：FileUtilExt
 * @Description 功能说明：
 * <p>
 * TODO
 * </p>
 * **********************************************************************
 * @date 创建日期： 2019-11-01 cherish
 */
public class FileUtilExt extends FileUtil {

    /**
     * 创建文件夹
     *
     * @param fileName 文件名
     * @param _isDir   是否文件夹标识
     * @return
     */
    public static boolean mkdirs(String fileName, boolean _isDir) {
        return mkdirs(new File(fileName), _isDir);
    }

    /**
     * 创建文件夹
     *
     * @param file   文件
     * @param _isDir 创建文件夹
     * @return
     */
    public static boolean mkdirs(File file, boolean _isDir) {
        return mkdir(file, _isDir);
    }

    /**
     * 创建文件夹
     * 注意：_file是文件夹则创建子文件夹，是文件则创建文件同级文件夹
     *
     * @param _file  file对象
     * @param _isDir 是否文件夹标识
     * @return
     */
    public static boolean mkdir(File _file, boolean _isDir) {
        File dir = _file;
        if (!_isDir) {
            dir = _file.getParentFile();
        }
        return dir.mkdirs();
    }

    /**
     * 获取文件类型
     * 后缀，不包含点
     * 如果没有后缀返回""
     *
     * @param fileName 文件名，可以带路径
     * @return
     */
    public static String getFileType(String fileName) {
        int i = fileName.lastIndexOf(".");
        if (i == -1) {
            return "";
        }
        return fileName.substring(i + 1);
    }

    /**
     * 获取文件名
     *
     * @param fileName 文件名
     * @return
     */
    public static String getFileName(String fileName) {
        return new File(fileName).getName();
    }

    /**
     * 创建新文件
     *
     * @param fileName 文件名
     * @return
     */
    public static boolean createNewFile(String fileName) {
        return createNewFile(new File(fileName));
    }

    /**
     * 创建新文件
     *
     * @param file 文件对象
     * @return
     */
    public static boolean createNewFile(File file) {
        mkdirs(file, false);
        try {
            return file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 递归遍历文件夹，递归保存子文件夹
     *
     * @param dir    当前遍历文件夹
     * @param filter 文件过滤器
     * @return
     */
    public static List<File> listFiles(File dir, FileFilter filter) {
        List<File> files = new ArrayList();
        if (dir.exists() && !dir.isFile()) {
            listFiles(files, dir, filter);
            return files;
        } else {
            return files;
        }
    }

    /**
     * 递归遍历文件夹，递归保存子文件夹
     *
     * @param filesList 文件容器
     * @param dir       当前遍历文件夹
     * @param filter    文件过滤器
     */
    private static void listFiles(List filesList, File dir, FileFilter filter) {
        File[] files = dir.listFiles(filter);
        List temp = Arrays.asList(files);
        Collections.sort(temp);
        filesList.addAll(temp);
        File[] subDirs = dir.listFiles(FileFilterUtilExt.directoryFileFilter());
        for (int i = 0; i < subDirs.length; ++i) {
            listFiles(filesList, subDirs[i], filter);
        }
    }
}
